package client;

import java.awt.Dimension;
import java.awt.Font;

import java.awt.event.*;

import javax.swing.*;


/**
 * Panel pour la creation d'une nouvelle partie.
 * Les informations suivantes sont saisies :
 * - Nom
 * - Nb de mines
 * - Nb d'objets magiques
 * - Dimensions
 * - Nombre de joueurs maximal
 * - Duree du temps de tour
 * @author Jonathan Gander
 * @version 1.0
 */
public class JPanelConfigGame extends JPanel {
	private static final long serialVersionUID = -7493270579524855704L;
	
	private final ClientApplication clientApp;
	
	// Constantes pour les parametres du jeu
	private int dimMin = 10;
	private int dimMax = 50;
	private int timeMax = 10; // minute
	
	// Objets de l'interface graphique
	private JTextField txtName  = new JTextField();
	private JTextField txtNbMines = new JTextField();
	private JTextField txtNbObjMagiques = new JTextField();
	private JTextField txtDim = new JTextField();
	private JTextField txtPlayers = new JTextField();
	private JTextField txtTime = new JTextField();
	
	private JButton btnCancel = new JButton("Annuler");
	private JButton btnCreate = new JButton("Creer la partie");
	
	/**
	 * Constructeur du panel
	 * @param clientApp L'application cliente
	 */
	public JPanelConfigGame(ClientApplication clientApp){
		this.clientApp = clientApp;
		this.setPreferredSize(new Dimension(350, 250));
		
		// Titre
		JLabel lblTitle   = new JLabel();
		lblTitle.setPreferredSize(new Dimension(350,30));
		lblTitle.setText("Nouvelle partie");
		lblTitle.setFont(new Font(lblTitle.getFont().getName(),
				lblTitle.getFont().getStyle(), 18));
		this.add(lblTitle);
		
		// Legende
		JLabel lblLegend = new JLabel();
		lblLegend.setPreferredSize(new Dimension(350,20));
		lblLegend.setText("Entrez les informations de la partie:");
		this.add(lblLegend);
		
		// Variables pour les tailles des labels et champs
		int x1 = 190, y1 = 20, 
			x2 = 140, y2 = 20;
		// Nom
		JLabel lblName = new JLabel("Nom de la partie");
		lblName.setPreferredSize(new Dimension(x1,y1));
		this.add(lblName);
		txtName.setPreferredSize(new Dimension(x2,y2));
		this.add(txtName);
		
		
		// Dimensions
		JLabel lblDim = new JLabel("Dimension");
		lblDim.setPreferredSize(new Dimension(x1,y1));
		this.add(lblDim);
		txtDim.setPreferredSize(new Dimension(x2,y2));
		txtDim.setText("15");
		this.add(txtDim);
		
		// Nombre de mines
		JLabel lblNbMine = new JLabel("Nb de mines");
		lblNbMine.setPreferredSize(new Dimension(x1,y1));
		this.add(lblNbMine);
		txtNbMines.setPreferredSize(new Dimension(x2,y2));
		txtNbMines.setText("50");
		this.add(txtNbMines);
		
		// Nombre d'objets magiques
		JLabel lblNbObjMagiques = new JLabel("Nb d'objets magiques");
		lblNbObjMagiques.setPreferredSize(new Dimension(x1,y1));
		this.add(lblNbObjMagiques);
		txtNbObjMagiques.setPreferredSize(new Dimension(x2,y2));
		txtNbObjMagiques.setText("20");
		this.add(txtNbObjMagiques);
		
		// Nombre de joueurs
		JLabel lblPlayers = new JLabel("Nb de joueurs");
		lblPlayers.setPreferredSize(new Dimension(x1,y1));
		this.add(lblPlayers);
		txtPlayers.setPreferredSize(new Dimension(x2,y2));
		txtPlayers.setText("4");
		this.add(txtPlayers);
		
		// Temps pour le tour par tour
		JLabel lblTime = new JLabel("Temps du tour par tour (min)");
		lblTime.setPreferredSize(new Dimension(x1,y1));
		this.add(lblTime);
		txtTime.setPreferredSize(new Dimension(x2,y2));
		txtTime.setText("1");
		this.add(txtTime);
		
		// Bouton annuler
		btnCancel.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				// Affiche la vue d'affichage de parties
				JPanelConfigGame.this.clientApp.getClientView().showListGameDialog();
			}
		});
		
		// Bouton Creer
		btnCreate.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (JPanelConfigGame.this.checkDatas()) {
					// Faire ici l'envoi de la creation de la partie
					System.out.println("Envoyer les donnees");
					JPanelConfigGame.this.clientApp.internals.createGame(txtName.getText(), 
							Integer.valueOf(txtNbMines.getText()), 
							Integer.valueOf(txtNbObjMagiques.getText()),
							Integer.valueOf(txtDim.getText()), 
							Integer.valueOf(txtPlayers.getText()), 
							Integer.valueOf(txtTime.getText()));
				}
				else {
					// Invalide
					System.out.println("Erreur, donnees invalides");
				}
			}
		});
		this.add(btnCancel);
		this.add(btnCreate);
	}
	
	/**
	 * Permet de fixer le focus
	 */
	public void setFocus() {
		txtName.requestFocus();
	}
	
	/**
	 * Permet de verifier les donnees entrees
	 */
	private boolean checkDatas() {
		
		String name = txtName.getText();
		String dim = txtDim.getText();
		String nbMines = txtNbMines.getText();
		String nbObjMag = txtNbObjMagiques.getText();
		String nbPlayers = txtPlayers.getText();
		String nbTime = txtTime.getText();
		
		// Nom
		if (name.equals("") || dim.equals("") || nbMines.equals("")
			|| nbObjMag.equals("") || nbPlayers.equals("") || 
			nbTime.equals("")) {
			JOptionPane.showMessageDialog(this, 
					"Vous devez renseigner tous les champs !",
					"Erreur de saisie",JOptionPane.ERROR_MESSAGE);
			
			return false;
		}
		
		
		// Dimension
		if (!isValue(dim)) {
			JOptionPane.showMessageDialog(this, 
					"La dimension doit etre un nombre !",
					"Erreur de saisie",JOptionPane.ERROR_MESSAGE);
			return false;
		}
		else {
			if (Integer.valueOf(dim) < dimMin) {
				// Dimension trop petite
				JOptionPane.showMessageDialog(this, 
						"La dimension est trop petite (min 10) !",
						"Erreur de saisie",JOptionPane.ERROR_MESSAGE);
				return false;
			}
			if (Integer.valueOf(dim) > dimMax) {
				// Erreur dimension trop grande
				JOptionPane.showMessageDialog(this, 
						"La dimension est trop grande (max 50) !",
						"Erreur de saisie",JOptionPane.ERROR_MESSAGE);
				return false;
			}
		}
		
		// Nb mines
		if (!isValue(nbMines)) {
			JOptionPane.showMessageDialog(this, 
					"Le nombre de mines doit etre une nombre !",
					"Erreur de saisie",JOptionPane.ERROR_MESSAGE);
			return false;
		}
		else { // verifie la coherence
			if (Integer.valueOf(nbMines) <= 0) {
				JOptionPane.showMessageDialog(this, 
						"Il faut au moins une mine pour jouer !",
						"Erreur de saisie",JOptionPane.ERROR_MESSAGE);
				return false;
			}
			int d = Integer.valueOf(dim);
			if (Integer.valueOf(nbMines) >= d * d) {
				// Erreur, trop de mines
				JOptionPane.showMessageDialog(this, 
						"Nombre de mines trop grand (max "+ (d*d - 1) +")",
						"Erreur de saisie",JOptionPane.ERROR_MESSAGE);
				return false;
			}
		}
		
		// Nb objets magiques
		if (!isValue(nbObjMag)) {
			JOptionPane.showMessageDialog(this, 
					"Le nombre d'objets magiques doit etre un nombre !",
					"Erreur de saisie",JOptionPane.ERROR_MESSAGE);
			return false;
		}
		else {
			if (Integer.valueOf(nbObjMag) < 0) {
				JOptionPane.showMessageDialog(this, 
					"Le nombre d'objets magiques ne peut pas etre negatif !",
					"Erreur de saisie",JOptionPane.ERROR_MESSAGE);
				return false;
			}
			int d = Integer.valueOf(dim);
			if (Integer.valueOf(nbObjMag) > d*d) {
				// Erreur, trop d'objets magiques
				JOptionPane.showMessageDialog(this, 
						"Nombre d'objets magiques trop grand (max "+d*d+")",
						"Erreur de saisie",JOptionPane.ERROR_MESSAGE);
				return false;
			}
		}
		
		// Nb players
		if (!isValue(nbPlayers)) {
			JOptionPane.showMessageDialog(this, 
					"Le nombre de joueurs doit etre un nombre !",
					"Erreur de saisie",JOptionPane.ERROR_MESSAGE);
			return false;
		}
		else {
			if (Integer.valueOf(nbPlayers) < 2) {
				JOptionPane.showMessageDialog(this, 
						"Le nombre de joueur ne peut etre inferieur a 2 !",
						"Erreur de saisie",JOptionPane.ERROR_MESSAGE);
				return false;
			}
		}

		// Duree du tour par tour
		if (!isValue(nbTime)) {
			JOptionPane.showMessageDialog(this, 
					"La duree du tour a tour doit etre un nombre !",
					"Erreur de saisie",JOptionPane.ERROR_MESSAGE);
			return false;
		}
		else {
			if (Integer.valueOf(nbTime) < 1) {
				JOptionPane.showMessageDialog(this, 
						"La duree du tour a tour ne peut pas etre plus petite que 1 minute !",
						"Erreur de saisie",JOptionPane.ERROR_MESSAGE);
				return false;
			}
			if (Integer.valueOf(nbTime) > timeMax) {
				// Erreur, temps trop grand
				JOptionPane.showMessageDialog(this, 
						"Duree du tour a tour trop grande (max 10min) !",
						"Erreur de saisie",JOptionPane.ERROR_MESSAGE);
				return false;
			}
		}
		
		return true;
	}
	
	/**
	 * Permet de savoir si un string est une valeur
	 * @param s String a tester
	 */
	private boolean isValue(String s) {
		try {
			Integer.valueOf(s);
			return true;
		}
		catch (Exception e) {
			return false;
		}
	}
	
}
